package Top101K;

/**
 * @Author quan
 * @Description 反转字符串
 * @Date 2023/11/17 10:00
 */
public class BM83_ReverseStr {
    public static void main(String[] args) {
        String str = " a b";
        System.out.println(trans(str, str.length()));

    }
    /**
     * 把这个字符串中由空格隔开的单词反序，同时反转每个字符的大小写。
     * @param s 字符串  Hello World
     * @param n 长度
     * @return  wORLD hELLO
     */
    public static String trans (String s, int n) {
        //1-遍历字符串，遇见大写转小写，小写转大写，空格则直接添加
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < n; i++) {
            if(s.charAt(i) >= 'A' && s.charAt(i) <= 'Z'){
                //大写转为小写
                sb.append((char) (s.charAt(i) - 'A' +'a'));
            } else if (s.charAt(i) >= 'a' && s.charAt(i) <= 'z') {
                //小写转为大写
                sb.append((char) (s.charAt(i) - 'a' +'A'));
            } else if (s.charAt(i) == ' ') {
                //如果遇见的是空格
                sb.append((s.charAt(i)));
            }
        }
//        return sb.toString();
        //2-反转整个字符串
        sb = sb.reverse(); // " h i"——>"I H "
        //3-以空格为子字符串的结束标志，反转局部字符串
        int start = 0;
        for (int i = 0; i < n; i++) {
            if(sb.charAt(i) == ' ' || i == n-1){
                int end = i;
                //获取局部子字符串
                String subStr = sb.substring(start,end);
                //新建一个容器，放入子字符串,并反转
                StringBuilder newSb = new StringBuilder(subStr);
                String newSubStr = newSb.reverse().toString();
                //将反转后的子字符串 替换 原有容器中的位置
                if(i == n-1 && sb.charAt(i)!=' '){
                    //防止出现特例： 加上&& sb.charAt(i)!=' ' 之后才能处理这种情况的字符串： str = " a b"
                    sb.replace(start,end+1,sb.charAt(i)+newSubStr);
                    break;
                }else{
                    sb.replace(start,end,newSubStr);
                }
                //更新下一次子字符串的开始位置
                start = end+1;
            }

        }
        return sb.toString();

    }
}
